package com.zqh.volatileDemo.CAS;

import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder;

/**
 * @author 曾庆红
 * {@code @date} 2023-10-12 17:50
 */

public class T2 {
    static long count2 = 0L;
    static AtomicLong count1 = new AtomicLong(0L);
    static LongAdder count3 = new LongAdder();
    static final Object lock = new Object();

    public static void main(String[] args) throws InterruptedException {
        Thread[] threads = new Thread[1000];
        for(int i = 0; i<threads.length; i++){
            threads[i] = new Thread(()->{
                for(int k = 0; k<100000; k++){
                    count1.incrementAndGet();
                }
            });
        }
        long start = System.currentTimeMillis();
        for(Thread t : threads) t.start();
        for (Thread t : threads)t.join();
        long end = System.currentTimeMillis();
        System.out.println("Atomic: "+ count1.get() + " time: " + (end-start));


        for(int i = 0; i<threads.length; i++){
            threads[i] = new Thread(()->{
                for (int k = 0; k<100000; k++){
                    synchronized (lock){
                        count2++;
                    }
                }
            });
        }
        start = System.currentTimeMillis();
        for (Thread t : threads) t.start();
        for (Thread t : threads) t.join();
        end =System.currentTimeMillis();
        System.out.println("synchronize "+count2 + " time: "+(end-start));

        for (int i = 0; i<threads.length; i++){
            threads[i] = new Thread(()->{
                for (int j =0; j<100000; j++){
                    count3.increment();
                }
            });
        }
        start = System.currentTimeMillis();
        for (Thread t : threads) t.start();
        for (Thread t : threads) t.join();
        end = System.currentTimeMillis();
        System.out.println("LongAdder: "+count3.longValue()+" time: "+(end - start));

    }
}
